Data Collection
Experiment Softwares
Psychopy
PsychoPy is an free cross-platform package allowing you run a wide range of in the behavioral sciences (neuroscience, psychology, psychophysics, linguistics…). (Source: Psychopy website)


Build your first PsychoPy experiment LinkÂ
Build the Posner cueing task LinkÂ
A series of tutorials for building a memory task LinkÂ
Create basic components using the coder view link
Book: Building Experiments in PsychoPy (by Jonathan Peirce and Michael MacAskill) link
Book: Programming Visual Illusions for Everyone (by Marco Bertamini) link
Paper: PsychoPy2: Experiments in behavior made easy link
Get stuck? Ask your questions here
Data Cleaning and Analysis
R
Book: R for data science link
Book: ggplot2: Elegant Graphics for Data Analysis link
Book: Fundamentals of Data Visualization link
Book: Learning statistics with R: A tutorial for psychology students and other beginners link
Book: R for Psychology link
Book: A Language, not a Letter: Learning Statistics in R link
Book: Foundations of Statistics with R link
Book: Statistical Rethinking with brms, ggplot2, and the tidyverse link
Course: Data Science: Foundations using R link
Example: Doing an Analysis of Variance (ANOVA) in R link
Python
Book: Python for Everybody: Exploring Data Using Python 3 link
Course; Python for Everybody Specialization link
Data Analysis in Python with Pandas link
Data Visualization in Python using Matplotlib link
Example: Doing an Analysis of Variance (ANOVA) in Python link
Reproducible Research
Until quite recently, making research open required a great deal of extra work for researchers and was less likely to be done. Now, with available tools, the benefits of openness can be a by-product of time-saving efficiencies, because tools that reduce data headaches also result in science that is more transparent, reproducible, collaborative and freely accessible to others. (Lowndes et al., 2017)
Folder Structure

Setting up an Organised Folder Structure for Research Projects link
Transition your workflow, keep your sanity link
Organising Your Data link
23 (research data) Things link
Project-oriented workflow link
Git
Happy Git and GitHub for the useR link
The Turing Way: Version Control link
Reproducible workflow and version control with Git and Github link
Rmarkdown and Jupyter Notebooks
R Markdown provides an authoring framework for data science. You can use a single R Markdown file to both save and execute code [and] generate high quality reports that can be shared with an audience R Markdown documents are fully reproducible and support dozens of static and dynamic output formats. (Source: rstudio.com)
How does an Rmarkdown file look like? link
How does a Jupyter notebook file look like? link
Rmarkdown - Introduction and Basics link
Reproducible analysis using R, Rmarkdown, and the tidyverse link
Using Jupyter notebooks for interactive analyses and reproducible science link
Data Sharing
Open Science Framework (OSF)
OSF is a free, open-source Web tool designed to help researchers collaboratively manage, store, and share their research process and files related to their research. (Source: Soderberg, 2018)
You can preregister a study, upload a preprint, and connect your Github repository, Goggle Drive, or oneDrive to your project.
Zenodo
Zenodo is a general-purpose open-access repository developed under the European OpenAIRE program and operated by CERN. It allows researchers to deposit data sets, research software, reports, and any other research related digital artifacts. For each submission, a persistent digital object identifier (DOI) is minted, which makes the stored items easily citeable. (Source: Wikipedia)
LS0tCnRpdGxlOiAnPGRpdiBjbGFzcz0ianVtYm90cm9uIj48aDEgY2xhc3M9InRpdGxlIHRvYy1pZ25vcmUgZGlzcGxheS0zIj5IdW1hbiBEYXRhOiBGcm9tIEdhdGhlcmluZyB0byBTaGFyaW5nPC9oMT48L2Rpdj4nCmF1dGhvcjoKICAtIG5hbWU6ICJPbWlkIEdoYXNlbWkiCiAgICBlbWFpbDogb21pZHJlemEuZ2hhc2VtaUBoZHIubXEuZWR1LmF1CiAgICBhZmZpbGlhdGlvbjogRGVwYXJ0bWVudCBvZiBDb2duaXRpdmUgU2NpZW5jZSwgTWFjcXVhcmllIFVuaXZlcnNpdHkKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgICN0aGVtZTogc3BhY2VsYWIKICAgIHRoZW1lOiBkYXJrbHkKICAgIGhpZ2hsaWdodDoga2F0ZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHRydWUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLmFsaWduPSJjZW50ZXIiKQprbml0cjo6b3B0c19jaHVuayRzZXQoZGV2ID0gInBuZyIsCiAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IEZBTFNFKQpgYGAKCmBgYHtyIHBhY2thZ2Vsb2FkLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkoInRpZHl2ZXJzZSIpCmBgYAoKCgoKPHN0eWxlPgouZmx1aWQtcm93IHsKICB0ZXh0LWFsaWduOiAiY2VudGVyIjsKICBwYWRkaW5nOiAxMHB4OwogIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgd2lkdGg6IDEwMCU7Cn0KZGV2IC50b2MgewogIHBhZGRpbmc6IDIwcHg7CiAgbWFyZ2luLXRvcDogMjBweDsKfQphOnZpc2l0ZWQgewogIGNvbG9yOiBncmVlbjsKfQphOmhvdmVyIHsKICBjb2xvcjogaG90cGluazsKfQo8L3N0eWxlPgoKCgoKCgoKCgojIERhdGEgQ29sbGVjdGlvbgoKCgojIyBFeHBlcmltZW50IFNvZnR3YXJlcwoKCgojIyMgUHN5Y2hvcHkKCj5Qc3ljaG9QeSBpcyBhbiBmcmVlIGNyb3NzLXBsYXRmb3JtIHBhY2thZ2UgYWxsb3dpbmcgeW91IHJ1biBhIHdpZGUgcmFuZ2Ugb2YgaW4gdGhlIGJlaGF2aW9yYWwgc2NpZW5jZXMgKG5ldXJvc2NpZW5jZSwgcHN5Y2hvbG9neSwgcHN5Y2hvcGh5c2ljcywgbGluZ3Vpc3RpY3MuLi4pLiAKKFNvdXJjZTogW1BzeWNob3B5IHdlYnNpdGVdKGh0dHBzOi8vd3d3LnBzeWNob3B5Lm9yZy8pKQoKCmBgYHtyIGVjaG89Riwgb3V0LndpZHRoPSc1MCUnLCBvdXQuaGVpZ2h0PSIzMDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmUoJ0lucHV0JywncHN5Y2hvcHkxLnBuZycpKQpgYGAKCmBgYHtyIGVjaG89Riwgb3V0LndpZHRoPSc1MCUnLCBvdXQuaGVpZ2h0PSIzMDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmUoJ0lucHV0JywncHN5Y2hvcHk1LnBuZycpKQpgYGAKCgogIC0gQnVpbGQgeW91ciBmaXJzdCBQc3ljaG9QeSBleHBlcmltZW50IFtMaW5rXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVZWNnFodVFnc2lJJnQ9MzVzKVwgCgogIC0gQnVpbGQgdGhlIFBvc25lciBjdWVpbmcgdGFzayBbTGlua10oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1aUWQyUUVLX0duNClcIAoKICAtIEEgc2VyaWVzIG9mIHR1dG9yaWFscyBmb3IgYnVpbGRpbmcgYSBtZW1vcnkgdGFzayBbTGlua10oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj05QnFSeXV0MlVaaylcIAogIAogIC0gQ3JlYXRlIGJhc2ljIGNvbXBvbmVudHMgdXNpbmcgdGhlIGNvZGVyIHZpZXcgW2xpbmtdKGh0dHBzOi8vd3d3LmRqbWFubmlvbi5uZXQvcHN5Y2hfcHJvZ3JhbW1pbmcvdmlzaW9uL2ludHJvL2ludHJvLmh0bWwpCiAgCiAgLSAqQm9vayo6IEJ1aWxkaW5nIEV4cGVyaW1lbnRzIGluIFBzeWNob1B5IChieSBKb25hdGhhbiBQZWlyY2UgYW5kIE1pY2hhZWwgTWFjQXNraWxsKSBbbGlua10oaHR0cHM6Ly93d3cuYW1hem9uLmNvbS5hdS9CdWlsZGluZy1FeHBlcmltZW50cy1Qc3ljaG9QeS1Kb25hdGhhbi1QZWlyY2UvZHAvMTQ3Mzk5MTM5MCkKICAKICAtICpCb29rKjogUHJvZ3JhbW1pbmcgVmlzdWFsIElsbHVzaW9ucyBmb3IgRXZlcnlvbmUgKGJ5IE1hcmNvIEJlcnRhbWluaSkgW2xpbmtdKGh0dHBzOi8vd3d3LmFtYXpvbi5jb20uYXUvUHJvZ3JhbW1pbmctVmlzdWFsLUlsbHVzaW9ucy1FdmVyeW9uZS1CZXJ0YW1pbmkvZHAvMzMxOTY0MDY1OCkKICAKICAtICpQYXBlcio6IFBzeWNob1B5MjogRXhwZXJpbWVudHMgaW4gYmVoYXZpb3IgbWFkZSBlYXN5IFtsaW5rXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3B1Ym1lZC8zMDczNDIwNikKICAKICAtIEdldCBzdHVjaz8gQXNrIHlvdXIgcXVlc3Rpb25zIFtoZXJlXShodHRwczovL2Rpc2NvdXJzZS5wc3ljaG9weS5vcmcvKQoKCgojIyBPbmxpbmUgUGxhdGZvcm1zCgojIyMgUXVhbHRyaWNzCgpgYGB7ciBlY2hvPUYsIG91dC53aWR0aD0nNTAlJywgb3V0LmhlaWdodD0iMzAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlKCdJbnB1dCcsJ3F1YWx0cmljczEucG5nJykpCmBgYAoKYGBge3IgZWNobz1GLCBvdXQud2lkdGg9JzUwJScsIG91dC5oZWlnaHQ9IjMwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZSgnSW5wdXQnLCdxdWFsdHJpY3MyLnBuZycpKQpgYGAKCiAgLSBEZW1vOiBBIHNpbXBsZSBudW1lcmFjeSB0YXNrIFtsaW5rXShodHRwczovL21xZWR1LnF1YWx0cmljcy5jb20vamZlL2Zvcm0vU1ZfNEpEUHpWT3ZuSEhldWxUKQoKICAtIEEgbmljZSBpbnRyb2R1Y3Rpb24gdG8gbWFraW5nIGEgcXVhbHRyaWNzIHN1cnZleSBbbGlua10oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj14a1NVS1RkRDFIcyZ0PTMwMHMpCgogIC0gUXVhbHRyaWNzIEJlZ2lubmVyIFR1dG9yaWFsIFtwYXJ0IDFdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9X2hTby1sZGoxOWspIGFuZCBbcGFydCAyXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PU1QNmpUY0hVXzV3JnQ9NjgycykKCiAgLSBBbmQgYSBtb3JlIGFkdmFuY2VkIFF1YWx0cmljcyB0dXRvcmlhbCBbbGlua10oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1ZMS1qdEEtWGpGUSZ0PTIwMXMpCgoKIyMjIGZvcm1SCj5Gb3JtciBpcyBhIFBIUCBtaWNyby1mcmFtZXdvcmsgd2hpY2ggaW5zdGFsbHMgZWFzaWx5IGFuZCBoZWxwcyB5b3UgYnVpbGQsIGxheW91dCBhbmQgdmFsaWRhdGUgZm9ybXMgcXVpY2tseSwgcGFpbmxlc3NseSwgYW5kIHdpdGhvdXQgYWxsIHRoZSBjb21wbGljYXRlZCwgbWVzc3kgb3ZlcmhlYWQuCihTb3VyY2U6IFtmb3JtciBHaXRodWIgUGFnZV0oaHR0cHM6Ly9naXRodWIuY29tL2Zvcm1yL0Zvcm1yKSkKCmBgYHtyIGVjaG89Riwgb3V0LndpZHRoPSc2MCUnLCBvdXQuaGVpZ2h0PSIzMDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmUoJ0lucHV0JywnZm9ybXIyLnBuZycpKQpgYGAKCgogIC0gQSBuaWNlIGludHJvZHVjdGlvbiB0byBCdWlsZGluZyBhIFJlZ2lzdHJhdGlvbiBGb3JtIFtsaW5rXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUxnOFZRd3VOQ1BFJmZlYXR1cmU9eW91dHUuYmUpCiAgCiAgLSBCdWlsZGluZyBhIEZvcm06IHRoZSBCYXNpY3MgW2xpbmtdKGh0dHBzOi8vZm9ybXIuZ2l0aHViLmlvLykKICAKICAKICAKIyMjIFJFRENhcAo+UkVEQ2FwIGlzIGEgc2VjdXJlIHdlYiBhcHBsaWNhdGlvbiBmb3IgYnVpbGRpbmcgYW5kIG1hbmFnaW5nIG9ubGluZSBzdXJ2ZXlzIGFuZCBkYXRhYmFzZXMuIFdoaWxlIFJFRENhcCBjYW4gYmUgdXNlZCB0byBjb2xsZWN0IHZpcnR1YWxseSBhbnkgdHlwZSBvZiBkYXRhLCBpdCBpcyBzcGVjaWZpY2FsbHkgZ2VhcmVkIHRvIHN1cHBvcnQgb25saW5lIG9yIG9mZmxpbmUgZGF0YSBjYXB0dXJlIGZvciByZXNlYXJjaCBzdHVkaWVzIGFuZCBvcGVyYXRpb25zIAooU291cmNlOiBbcHJvamVjdC1yZWRjYXAub3JnXShodHRwczovL3d3dy5wcm9qZWN0LXJlZGNhcC5vcmcvKSkKCgojIyMgUHN5Y2hvcHkgKFBzeWNob0pTKS9QYXZsb3ZpYQoKPlBzeWNob0pTIGlzIGEgSmF2YVNjcmlwdCBsaWJyYXJ5IHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gcnVuIG5ldXJvc2NpZW5jZSwgcHN5Y2hvbG9neSwgYW5kIHBzeWNob3BoeXNpY3MgZXhwZXJpbWVudHMgaW4gYSBicm93c2VyLiBJdCBpcyB0aGUgb25saW5lIGNvdW50ZXJwYXJ0IG9mIHRoZSBQc3ljaG9QeSBQeXRob24gbGlicmFyeSAoU291cmNlOiBbUHN5Y2hvSnMgcmVwb3NpdG9yeV0oaHR0cHM6Ly9naXRodWIuY29tL3BzeWNob3B5L3BzeWNob2pzKSkuICpQYXZsb3ZpYS5vcmcqIGlzIGEgc2l0ZSBjcmVhdGVkIGJ5IHRoZSBQc3ljaG9QeSB0ZWFtIHRvIG1ha2UgaXQgZWFzeSB0byBydW4gc3R1ZGllcyBvbmxpbmUsIGhvc3QgeW91ciBleHBlcmltZW50cywgc2hhcmUgc3R1ZGllcyB3aXRoIG90aGVyIHNjaWVudGlzdHMsIGFuZCB2ZXJzaW9uIGNvbnRyb2wgeW91ciB3b3JrLiAKKFNvdXJjZTogW1BzeWNob3B5IHdlYnNpdGVdKGh0dHBzOi8vd3d3LnBzeWNob3B5Lm9yZy9vbmxpbmUvdXNpbmdQYXZsb3ZpYS5odG1sKSkKCmBgYHtyIGVjaG89Riwgb3V0LndpZHRoPSc1MCUnLCBvdXQuaGVpZ2h0PSIzMDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmUoJ0lucHV0JywncHN5Y2hvcHkzLnBuZycpKQpgYGAKCgogIC0gRGVtbzogVGhlIFBvc25lciB0YXNrIFtsaW5rXShodHRwczovL3J1bi5wYXZsb3ZpYS5vcmcvZGVtb3MvcG9zbmVyL2h0bWwvKQoKICAtIFVwbG9hZCB5b3VyIFBzeWNob3B5IGV4cGVyaW1lbnQgdG8gUGF2bG92aWEgW2xpbmtdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9YnByWWVCemtVYzgmbGlzdD1QTHFPcmJkS1dfV0ZSOEVCQkNyMXFQUE9lbXowd3dCa2dFKQoKICAtIFJ1bm5pbmcgeW91ciBleHBlcmltZW50IG9uIFBhdmxvdmlhLm9yZyBbbGlua10oaHR0cHM6Ly93d3cucHN5Y2hvcHkub3JnL29ubGluZS91c2luZ1BhdmxvdmlhLmh0bWwpCgogIC0gKlBhcGVyKjogVGhlIHRpbWluZyBtZWdhLXN0dWR5OiBjb21wYXJpbmcgYSByYW5nZSBvZiBleHBlcmltZW50IGdlbmVyYXRvcnMsIGJvdGggbGFiLWJhc2VkIGFuZCBvbmxpbmUgW2xpbmtdKGh0dHBzOi8vcHN5YXJ4aXYuY29tL2Q2bnU1LykKCiAgLSBHZXQgc3R1Y2s/IEFzayB5b3VyIHF1ZXN0aW9ucyBbaGVyZV0oaHR0cHM6Ly9kaXNjb3Vyc2UucHN5Y2hvcHkub3JnLykKCgojIyMgR29yaWxsYQoKPlRoZSBHb3JpbGxhIEV4cGVyaW1lbnQgQnVpbGRlciBpcyBhIGNsb3VkIGJhc2VkIHJlc2VhcmNoIHBsYXRmb3JtIHRoYXQgYWxsb3dzIHJlc2VhcmNoZXJzIGFuZCBzdHVkZW50cyB0byBxdWlja2x5IGFuZCBlYXNpbHkgY3JlYXRlIGFuZCBkZXBsb3kgYmVoYXZpb3VyYWwgKHJlYWN0aW9uLXRpbWUpIGV4cGVyaW1lbnRzIG9ubGluZSAKKFNvdXJjZTogW0dvcmlsbGEgd2Vic2l0ZV0oaHR0cHM6Ly9nb3JpbGxhLnNjL2luZm8vYmVoYXZpb3VyYWxyZXNlYXJjaCkpCgoKYGBge3IgZWNobz1GLCBvdXQud2lkdGg9JzUwJScsIG91dC5oZWlnaHQ9IjMwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZSgnSW5wdXQnLCdnb3JpbGxhMy5wbmcnKSkKYGBgCgpgYGB7ciBlY2hvPUYsIG91dC53aWR0aD0nNTAlJywgb3V0LmhlaWdodD0iMzAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlKCdJbnB1dCcsJ2dvcmlsbGEyLnBuZycpKQpgYGAKCgogIC0gRGVtbzogVGhlIGRvdC1wcm9iZSB0YXNrIFtsaW5rXShodHRwczovL3Jlc2VhcmNoLnNjL3Rhc2svMTQxNjExOSkKCiAgLSBHZXR0aW5nIHN0YXJ0ZWQgd2l0aCBHb3JpbGxhIFtsaW5rXShodHRwczovL3d3dy55b3V0dWJlLmNvbS9jaGFubmVsL1VDQm90NDVtV1dmLVZhM1BjV0pKWDY3dykKCiAgLSBHb3JpbGxhIHN1cHBvcnQgcGFnZSBbbGlua10oaHR0cHM6Ly9nb3JpbGxhLnNjL3N1cHBvcnQpCgogIC0gR29yaWxsYSBEZW1vcyBhbmQgRXhhbXBsZXMgTGlzdCBbbGlua10oaHR0cHM6Ly9nb3JpbGxhLnNjL3N1cHBvcnQvc2FtcGxlcykKCiAgLSAqUGFwZXIqOiBHb3JpbGxhIGluIG91ciBtaWRzdDogQW4gb25saW5lIGJlaGF2aW9yYWwgZXhwZXJpbWVudCBidWlsZGVyIFtsaW5rXShodHRwczovL2xpbmsuc3ByaW5nZXIuY29tL2FydGljbGUvMTAuMzc1OC9zMTM0MjgtMDE5LTAxMjM3LXgpCgoKIyMjIEpzUHN5Y2gKCmpzUHN5Y2ggaXMgYSBKYXZhU2NyaXB0IGxpYnJhcnkgZm9yIHJ1bm5pbmcgYmVoYXZpb3JhbCBleHBlcmltZW50cyBpbiBhIHdlYiBicm93c2VyLiBUaGUgbGlicmFyeSBwcm92aWRlcyBhIGZsZXhpYmxlIGZyYW1ld29yayBmb3IgYnVpbGRpbmcgYSB3aWRlIHJhbmdlIG9mIGxhYm9yYXRvcnktbGlrZSBleHBlcmltZW50cyB0aGF0IGNhbiBiZSBydW4gb25saW5lIChTb3VyY2U6IFtqc1BzeWNoIHdlYnNpdGVdKGh0dHBzOi8vd3d3LmpzcHN5Y2gub3JnLykpCgogIC0gQ3JlYXRlIGEgc2ltcGxlIFJlYWN0aW9uIFRpbWUgVGFzayBbbGlua10oaHR0cHM6Ly93d3cuanNwc3ljaC5vcmcvdHV0b3JpYWxzL3J0LXRhc2svKQoKICAtIEEgbW9yZSBkZXRhaWxlZCB0dXRvcmlhbCBvbiBqc1BzeWNoIGFuZCBHb29nbGUgYXBwIGVuZ2luZSBbbGlua10oaHR0cDovL2Njc3MuZGpuYXZhcnJvLm5ldC90YWxrcy8yMDE3L1VOU1dDQ1NfYnJvd3Nlci5wZGYpCgogIC0gT25saW5lIGxpbmd1aXN0aWNzIGV4cGVyaW1lbnRzIHVzaW5nIGpzUHN5Y2ggKE5hLVlvdW5nIFJ5LCAyMDE4KSBbbGlua10oaHR0cDovL2luZGl2aWR1YWwudXRvcm9udG8uY2EvcnJybm55L29ubGluZS5odG1sKQoKICAtICpQYXBlcio6IGpzUHN5Y2g6IEEgSmF2YVNjcmlwdCBsaWJyYXJ5IGZvciBjcmVhdGluZyBiZWhhdmlvcmFsIGV4cGVyaW1lbnRzIGluIGEgV2ViIGJyb3dzZXIgW2xpbmtdKGh0dHBzOi8vbGluay5zcHJpbmdlci5jb20vYXJ0aWNsZS8xMC4zNzU4L3MxMzQyOC0wMTQtMDQ1OC15KQoKCgojIyMgSmF5c2lyZQoKPlRoZSBnb2FsIG9mIGpheXNpcmUgaXMgdG8gcHJvdmlkZSBhIG1ldGhvZCBmb3Igd3JpdGluZyBiZWhhdmlvdXJhbCBleHBlcmltZW50cyBpbiBSIHRoYXQgY2FuIGJlIGRlcGxveWVkIHRocm91Z2ggYSB3ZWIgYnJvd3Nlci4gVGhlIHBhY2thZ2UgcmVsaWVzIG9uIHRoZSBqc1BzeWNoIGxpYnJhcnkgYnkgSm9zaCBkZSBMZWV1dyAoR2l0SHViIHBhZ2UpIHRvIGNyZWF0ZSB0aGUgZXhwZXJpbWVudHMsIGFuZCBpcyBzdHJ1Y3R1cmVkIHNvIHRoYXQgZnVuY3Rpb25zIGluIGpheXNpcmUgdXNlIHRoZSBzYW1lIGFyZ3VtZW50IG5hbWVzIGFzIHRoZSBjb3JyZXNwb25kaW5nIGpzUHN5Y2ggZnVuY3Rpb25zLiAKKFNvdXJjZTogW2pheXNpcmUgcmVwb3NpdG9yeV0oaHR0cHM6Ly9naXRodWIuY29tL2RqbmF2YXJyby9qYXlzaXJlKSkKCgogIC0gRGVtbzogQSBjaG9pY2UgcmVhY3Rpb24gdGltZSB0YXNrIFtsaW5rXShodHRwOi8vamF5c2lyZS5kam5hdmFycm8ubmV0L2RlbW9zL2V4YW1wbGUwOC9leHBlcmltZW50L2luZGV4Lmh0bWwpCgogIC0gQ3JlYXRlIGFuIG9ubGluZSBleHBlcmltZW50IHVzaW5nIEpheXNpcmUgW3BhcnQgMV0oaHR0cHM6Ly9jc2tlbXAuZ2l0aHViLmlvL2NoZHNzMjAxOV9jb250ZW50L2RheTIvc2xpZGVzLzEtZXhwZXJpbWVudC1tb3RpdmF0aW9uLWhhbmRvdXQucGRmKSBbcGFydCAyXShodHRwczovL2Nza2VtcC5naXRodWIuaW8vY2hkc3MyMDE5X2NvbnRlbnQvZGF5Mi9zbGlkZXMvMy10ZW1wbGF0ZS1leHBlcmltZW50LWhhbmRvdXQucGRmKSBbcGFydCAzXShodHRwczovL2Nza2VtcC5naXRodWIuaW8vY2hkc3MyMDE5X2NvbnRlbnQvZGF5Mi9zbGlkZXMvNC1tb3JlLWNvbXBsZXgtZXhwZXJpbWVudHMtaGFuZG91dC5wZGYpCgogIC0gQmVoYXZpb3VyYWwgZXhwZXJpbWVudHMgd2l0aCBqYXlzaXJlIFtsaW5rXShodHRwczovL2dpdGh1Yi5jb20vT21pZEdoYXNlbWkyMS9qYXlzaXJlKQoKCiMjIyBFbXBpcmljYQo+IEVtcGlyaWNhIGlzIGFuIG9wZW4tc291cmNlIEphdmFTY3JpcHQgZnJhbWV3b3JrIGZvciBydW5uaW5nIG11bHRpcGxheWVyIGludGVyYWN0aXZlIGV4cGVyaW1lbnRzIGFuZCBnYW1lcyBpbiB0aGUgYnJvd3Nlci4gSXQgd2FzIGNyZWF0ZWQgdG8gbWFrZSBpdCBlYXN5IHRvIGRldmVsb3AgYW5kIGl0ZXJhdGUgb24gc29waGlzdGljYXRlZCBkZXNpZ25zIGluIGEgc3RhdGlzdGljYWxseSBzb3VuZCBtYW5uZXIsIGFuZCBvZmZlcnMgYSB1bmlxdWUgY29tYmluYXRpb24gb2YgcG93ZXIsIGZsZXhpYmlsaXR5LCBhbmQgc3BlZWQuIAooU291cmNlOiBbZW1waXJpY2EubHldKGh0dHBzOi8vZW1waXJpY2EubHkvKSkKCmBgYHtyIGVjaG89Riwgb3V0LndpZHRoPSc2MCUnLCBvdXQuaGVpZ2h0PSIzMDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmUoJ0lucHV0JywnZW1waXJpY2ExLnBuZycpKQpgYGAKCgogIC0gR2V0dGluZyBzdGFydGVkIHdpdGggRW1waXJpY2EgW2xpbmtdKGh0dHBzOi8vZW1waXJpY2EubHkvZG9jcy9xdWljay1zdGFydC5odG1sKQogIAogIC0gQSBzZXJpZXMgb2YgdHV0b3JpYWxzIGZvciBidWlsZGluZyBhIHNpbXBsZSBpbnRlcmFjdGl2ZSB0YXNrIFtMaW5rXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUsyWWhFWmV5XzU4Jmxpc3Q9UExQUWVsdlV3eVZnaWF3QkRrM1NwNzRRTWZMOFJQZ09SVylcIAogIAogIC0gVXNpbmcgRW1waXJpY2EgZm9yIGhpZ2gtdGhyb3VnaHB1dCB2aXJ0dWFsIGxhYiBleHBlcmltZW50cyAoYW4gaW50ZXJlc3RpbmcgZXhwZXJpbWVudCkgW0xpbmtdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9TkdCRGdWV3AwamMmZmVhdHVyZT1lbWJfdGl0bGUpXCAKICAKIyBEYXRhIENsZWFuaW5nIGFuZCBBbmFseXNpcwoKIyMgUgoKICAtIEJvb2s6IFIgZm9yIGRhdGEgc2NpZW5jZSBbbGlua10oaHR0cHM6Ly9yNGRzLmhhZC5jby5uei9pbmRleC5odG1sKQoKICAtIEJvb2s6IGdncGxvdDI6IEVsZWdhbnQgR3JhcGhpY3MgZm9yIERhdGEgQW5hbHlzaXMgW2xpbmtdKGh0dHBzOi8vZ2dwbG90Mi1ib29rLm9yZy9pbmRleC5odG0pCgogIC0gQm9vazogRnVuZGFtZW50YWxzIG9mIERhdGEgVmlzdWFsaXphdGlvbiBbbGlua10oRnVuZGFtZW50YWxzIG9mIERhdGEgVmlzdWFsaXphdGlvbikKCiAgLSBCb29rOiBMZWFybmluZyBzdGF0aXN0aWNzIHdpdGggUjogQSB0dXRvcmlhbCBmb3IgcHN5Y2hvbG9neSBzdHVkZW50cyBhbmQgb3RoZXIgYmVnaW5uZXJzIFtsaW5rXShodHRwczovL2xlYXJuaW5nc3RhdGlzdGljc3dpdGhyLmNvbS9ib29rLykKCiAgLSBCb29rOiBSIGZvciBQc3ljaG9sb2d5IFtsaW5rXShodHRwczovL2dsZW5ud2lsbGlhbXMubWUvcjRwc3ljaC8pCgogIC0gQm9vazogQSBMYW5ndWFnZSwgbm90IGEgTGV0dGVyOiBMZWFybmluZyBTdGF0aXN0aWNzIGluIFIgW2xpbmtdKGh0dHBzOi8vYWRlbW9zLnBlb3BsZS51aWMuZWR1L2luZGV4Lmh0bWwpCgogIC0gQm9vazogRm91bmRhdGlvbnMgb2YgU3RhdGlzdGljcyB3aXRoIFIgW2xpbmtdKGh0dHBzOi8vbWF0aHN0YXQuc2x1LmVkdS9+c3BlZWdsZS9fYm9vay9wcmVmYWNlLmh0bWwpCgogIC0gQm9vazogU3RhdGlzdGljYWwgUmV0aGlua2luZyB3aXRoIGJybXMsIGdncGxvdDIsIGFuZCB0aGUgdGlkeXZlcnNlIFtsaW5rXShodHRwczovL2Jvb2tkb3duLm9yZy9hamt1cnovU3RhdGlzdGljYWxfUmV0aGlua2luZ19yZWNvZGVkLykKCiAgLSBDb3Vyc2U6IERhdGEgU2NpZW5jZTogRm91bmRhdGlvbnMgdXNpbmcgUiBbbGlua10oaHR0cHM6Ly93d3cuY291cnNlcmEub3JnL3NwZWNpYWxpemF0aW9ucy9kYXRhLXNjaWVuY2UtZm91bmRhdGlvbnMtciNjb3Vyc2VzKQoKICAtIEV4YW1wbGU6IERvaW5nIGFuIEFuYWx5c2lzIG9mIFZhcmlhbmNlIChBTk9WQSkgaW4gUiBbbGlua10oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2FmZXgvdmlnbmV0dGVzL2FmZXhfYW5vdmFfZXhhbXBsZS5odG1sKQoKCiMjIFB5dGhvbgoKICAtIEJvb2s6IFB5dGhvbiBmb3IgRXZlcnlib2R5OiBFeHBsb3JpbmcgRGF0YSBVc2luZyBQeXRob24gMyBbbGlua10oaHR0cDovL2RvMS5kci1jaHVjay5jb20vcHl0aG9ubGVhcm4vRU5fdXMvcHl0aG9ubGVhcm4ucGRmKQoKICAtIENvdXJzZTsgUHl0aG9uIGZvciBFdmVyeWJvZHkgU3BlY2lhbGl6YXRpb24gW2xpbmtdKGh0dHBzOi8vd3d3LmNvdXJzZXJhLm9yZy9zcGVjaWFsaXphdGlvbnMvcHl0aG9uI2NvdXJzZXMpCgogIC0gRGF0YSBBbmFseXNpcyBpbiBQeXRob24gd2l0aCBQYW5kYXMgW2xpbmtdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9eXpJTWlyY0dVNUkmbGlzdD1QTDUtZGEzcUdCNUlDQ3NnVzFNeGxaMEhxOExMNVUzdTl5KQoKICAtIERhdGEgVmlzdWFsaXphdGlvbiBpbiBQeXRob24gdXNpbmcgTWF0cGxvdGxpYiBbbGlua10oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1VTzk4bEpRM1FHSSZsaXN0PVBMLW9zaUU4MFRlVHZpcE9xb21WRWVaMUhScmNFdnRaQl8pCgogIC0gRXhhbXBsZTogRG9pbmcgYW4gQW5hbHlzaXMgb2YgVmFyaWFuY2UgKEFOT1ZBKSBpbiBQeXRob24gW2xpbmtdKGh0dHBzOi8vcmVuZXNoYmVkcmUuZ2l0aHViLmlvL2Jsb2cvYW5vdmEuaHRtbCkKCgojIFJlcHJvZHVjaWJsZSBSZXNlYXJjaAoKPiBVbnRpbCBxdWl0ZSByZWNlbnRseSwgbWFraW5nIHJlc2VhcmNoIG9wZW4gcmVxdWlyZWQgYSBncmVhdCBkZWFsIG9mIGV4dHJhIHdvcmsgZm9yIHJlc2VhcmNoZXJzIGFuZCB3YXMgbGVzcyBsaWtlbHkgdG8gYmUgZG9uZS4gTm93LCB3aXRoIGF2YWlsYWJsZSB0b29scywgdGhlIGJlbmVmaXRzIG9mIG9wZW5uZXNzIGNhbiBiZSBhIGJ5LXByb2R1Y3Qgb2YgdGltZS1zYXZpbmcgZWZmaWNpZW5jaWVzLCBiZWNhdXNlIHRvb2xzIHRoYXQgcmVkdWNlIGRhdGEgaGVhZGFjaGVzIGFsc28gcmVzdWx0IGluIHNjaWVuY2UgdGhhdCBpcyBtb3JlIHRyYW5zcGFyZW50LCByZXByb2R1Y2libGUsIGNvbGxhYm9yYXRpdmUgYW5kIGZyZWVseSBhY2Nlc3NpYmxlIHRvIG90aGVycy5cIAoqKFtMb3duZGVzIGV0IGFsLiwgMjAxN10oaHR0cHM6Ly93d3cubmF0dXJlLmNvbS9hcnRpY2xlcy9zNDE1NTktMDE3LTAxNjApKSoKCmBgYHtyIGVjaG89Riwgb3V0LndpZHRoPSc2MCUnLCBmaWcuY2FwPSIqU291cmNlKjogT3VyIHBhdGggdG8gYmV0dGVyIHNjaWVuY2UgaW4gbGVzcyB0aW1lIHVzaW5nIG9wZW4gZGF0YSBzY2llbmNlIHRvb2xzIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZSgnSW5wdXQnLCdyZXBfcmVzMS5wbmcnKSkKYGBgCgoKICAtICoqRkFJUioqIFByaW5jaXBsZXM6CgogICAgLSAqRmluZGFibGUqCgogICAgLSAqQWNjZXNzaWJsZSoKCiAgICAtICpJbnRlcm9wZXJhYmxlKgogIAogICAgLSAqUmV1c2FibGUqCgogLSBUaGUgRkFJUiBHdWlkaW5nIFByaW5jaXBsZXMgZm9yIHNjaWVudGlmaWMgZGF0YSBtYW5hZ2VtZW50IGFuZCBzdGV3YXJkc2hpcCBbbGlua10oaHR0cHM6Ly93d3cubmF0dXJlLmNvbS9hcnRpY2xlcy9zZGF0YTIwMTYxOCkKCgoKIyMjIEZvbGRlciBTdHJ1Y3R1cmUKCmBgYHtyIGVjaG89Riwgb3V0LndpZHRoPScxMjAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZSgnSW5wdXQnLCdmb2xkZXJfc3RydWM1LnBuZycpKQpgYGAKCgogIC0gU2V0dGluZyB1cCBhbiBPcmdhbmlzZWQgRm9sZGVyIFN0cnVjdHVyZSBmb3IgUmVzZWFyY2ggUHJvamVjdHMgW2xpbmtdKGh0dHA6Ly9uaWtvbGEubWUvZm9sZGVyX3N0cnVjdHVyZS5odG1sKQogIAogIC0gVHJhbnNpdGlvbiB5b3VyIHdvcmtmbG93LCBrZWVwIHlvdXIgc2FuaXR5IFtsaW5rXShodHRwczovL3NsaWRlcy5jb20vZGpuYXZhcnJvL3dvcmtmbG93Iy8pCgogIC0gT3JnYW5pc2luZyBZb3VyIERhdGEgW2xpbmtdKGh0dHBzOi8vd3d3LmRhdGEuY2FtLmFjLnVrL2RhdGEtbWFuYWdlbWVudC1ndWlkZS9vcmdhbmlzaW5nLXlvdXItZGF0YSkKICAKICAtIDIzIChyZXNlYXJjaCBkYXRhKSBUaGluZ3MgW2xpbmtdKGh0dHBzOi8vd3d3LmFuZHMub3JnLmF1L3dvcmtpbmctd2l0aC1kYXRhL3NraWxscy8yMy1yZXNlYXJjaC1kYXRhLXRoaW5ncy9hbGwyMykKCiAgLSBQcm9qZWN0LW9yaWVudGVkIHdvcmtmbG93IFtsaW5rXShodHRwczovL3d3dy50aWR5dmVyc2Uub3JnL2Jsb2cvMjAxNy8xMi93b3JrZmxvdy12cy1zY3JpcHQvKQoKIyMjIEdpdAoKYGBge3IgZWNobz1GLCBvdXQud2lkdGg9JzUwJScsIGZpZy5jYXA9IipTb3VyY2UqOiBbcGhkY29taWNzLmNvbV0oaHR0cDovL3BoZGNvbWljcy5jb20vY29taWNzLnBocD9mPTE1MzEpIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZSgnSW5wdXQnLCdnaXQxLmdpZicpKQpgYGAKCiAgLSBIYXBweSBHaXQgYW5kIEdpdEh1YiBmb3IgdGhlIHVzZVIgW2xpbmtdKGh0dHBzOi8vaGFwcHlnaXR3aXRoci5jb20vaW5kZXguaHRtbCkKCiAgLSBUaGUgVHVyaW5nIFdheTogVmVyc2lvbiBDb250cm9sIFtsaW5rXShodHRwczovL3RoZS10dXJpbmctd2F5Lm5ldGxpZnkuYXBwL3ZlcnNpb25fY29udHJvbC92ZXJzaW9uX2NvbnRyb2wuaHRtbCkKICAKICAtIFJlcHJvZHVjaWJsZSB3b3JrZmxvdyBhbmQgdmVyc2lvbiBjb250cm9sIHdpdGggR2l0IGFuZCBHaXRodWIgW2xpbmtdKGh0dHBzOi8vanVsZXMzMi5naXRodWIuaW8vMjAxNi0wNy0xMi1PeGZvcmQvZ2l0LykKICAgIAoKCgoKIyMjIFJtYXJrZG93biBhbmQgSnVweXRlciBOb3RlYm9va3MKCj5SIE1hcmtkb3duIHByb3ZpZGVzIGFuIGF1dGhvcmluZyBmcmFtZXdvcmsgZm9yIGRhdGEgc2NpZW5jZS4gWW91IGNhbiB1c2UgYSBzaW5nbGUgUiBNYXJrZG93biBmaWxlIHRvIGJvdGgKc2F2ZSBhbmQgZXhlY3V0ZSBjb2RlIApbYW5kXSBnZW5lcmF0ZSBoaWdoIHF1YWxpdHkgcmVwb3J0cyB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhbiBhdWRpZW5jZQpSIE1hcmtkb3duIGRvY3VtZW50cyBhcmUgZnVsbHkgcmVwcm9kdWNpYmxlIGFuZCBzdXBwb3J0IGRvemVucyBvZiBzdGF0aWMgYW5kIGR5bmFtaWMgb3V0cHV0IGZvcm1hdHMuCihTb3VyY2U6IFtyc3R1ZGlvLmNvbV0oaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vbGVzc29uLTEuaHRtbCkpIAoKICAtIEhvdyBkb2VzIGFuIFJtYXJrZG93biBmaWxlIGxvb2sgbGlrZT8gW2xpbmtdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9lbW1lYW5zL3ZpZ25ldHRlcy9iYXNpY3MuaHRtbCNiYWNrc3RvcnkpCiAgCiAgLSBIb3cgZG9lcyBhIEp1cHl0ZXIgbm90ZWJvb2sgZmlsZSBsb29rIGxpa2U/IFtsaW5rXShodHRwczovL29zZi5pby85YzdiMy8pCgogIC0gUm1hcmtkb3duIC0gSW50cm9kdWN0aW9uIGFuZCBCYXNpY3MgW2xpbmtdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9dEtVdWZ6cG9IREUmdD03OTZzKQogIAogIC0gUmVwcm9kdWNpYmxlIGFuYWx5c2lzIHVzaW5nIFIsIFJtYXJrZG93biwgYW5kIHRoZSB0aWR5dmVyc2UgW2xpbmtdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9cXZQREU0cHBBbnMmbGlzdD1QTEtXMkF6azIzWnRTT1VuTGFmRW4wVzFGRWYtUnctOHBpJmluZGV4PTMmdD04ODczcykKICAKICAtIFVzaW5nIEp1cHl0ZXIgbm90ZWJvb2tzIGZvciBpbnRlcmFjdGl2ZSBhbmFseXNlcyBhbmQgcmVwcm9kdWNpYmxlIHNjaWVuY2UgW2xpbmtdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9OWp4aVVsNFI4SU0mbGlzdD1QTEtXMkF6azIzWnRTT1VuTGFmRW4wVzFGRWYtUnctOHBpJmluZGV4PTImdD02Mjk2cykgCgoKCiMgRGF0YSBTaGFyaW5nCgoKIyMgT3BlbiBTY2llbmNlIEZyYW1ld29yayAoT1NGKQoKPk9TRiBpcyBhIGZyZWUsIG9wZW4tc291cmNlIFdlYiB0b29sIGRlc2lnbmVkIHRvIGhlbHAgcmVzZWFyY2hlcnMgY29sbGFib3JhdGl2ZWx5IG1hbmFnZSwgc3RvcmUsIGFuZCBzaGFyZSB0aGVpciByZXNlYXJjaCBwcm9jZXNzIGFuZCBmaWxlcyByZWxhdGVkIHRvIHRoZWlyIHJlc2VhcmNoLiAKKFNvdXJjZTogW1NvZGVyYmVyZywgMjAxOF0oaHR0cHM6Ly9qb3VybmFscy5zYWdlcHViLmNvbS9kb2kvZnVsbC8xMC4xMTc3LzI1MTUyNDU5MTg3NTc2ODkpKSAKCllvdSBjYW4gW3ByZXJlZ2lzdGVyXShodHRwczovL2hlbHAub3NmLmlvL2hjL2VuLXVzL2FydGljbGVzLzM2MDAxOTkzMDg5My1SZWdpc3Rlci1Zb3VyLVByb2plY3QpIGEgc3R1ZHksIHVwbG9hZCBhIFtwcmVwcmludF0oaHR0cHM6Ly9oZWxwLm9zZi5pby9oYy9lbi11cy9hcnRpY2xlcy8zNjAwMTk5MzA1MzMtVXBsb2FkLWEtUHJlcHJpbnQpLCBhbmQgY29ubmVjdCB5b3VyIFtHaXRodWJdKGh0dHBzOi8vaGVscC5vc2YuaW8vaGMvZW4tdXMvYXJ0aWNsZXMvMzYwMDE5OTI5ODEzLUNvbm5lY3QtR2l0SHViLXRvLWEtUHJvamVjdCkgcmVwb3NpdG9yeSwgW0dvZ2dsZSBEcml2ZV0oaHR0cHM6Ly9oZWxwLm9zZi5pby9oYy9lbi11cy9hcnRpY2xlcy8zNjAwMTk3MzczNzQtQ29ubmVjdC1Hb29nbGUtRHJpdmUtdG8tYS1Qcm9qZWN0KSwgb3IgW29uZURyaXZlXShodHRwczovL2hlbHAub3NmLmlvL2hjL2VuLXVzL2FydGljbGVzLzM2MDAxOTkyOTg3My1Db25uZWN0LU9uZURyaXZlLXRvLWEtUHJvamVjdCkgdG8geW91ciBwcm9qZWN0LgoKCiAgLSBBIHNhbXBsZSBwcm9qZWN0IFtsaW5rXShodHRwczovL29zZi5pby9lc3hjNC8pCgogIC0gQW4gT1NGIGJlZ2lubmVyIHR1dG9yaWFsIFtsaW5rXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWRMRUloSkVTSVFBJnQ9MThzKQoKICAtICpQYXBlcio6IFVzaW5nIE9TRiB0byBTaGFyZSBEYXRhOiBBIFN0ZXAtYnktU3RlcCBHdWlkZTogW2xpbmtdKGh0dHBzOi8vam91cm5hbHMuc2FnZXB1Yi5jb20vZG9pL2Z1bGwvMTAuMTE3Ny8yNTE1MjQ1OTE4NzU3Njg5KQoKCiMjIFplbm9kbwoKPlplbm9kbyBpcyBhIGdlbmVyYWwtcHVycG9zZSBvcGVuLWFjY2VzcyByZXBvc2l0b3J5IGRldmVsb3BlZCB1bmRlciB0aGUgRXVyb3BlYW4gT3BlbkFJUkUgcHJvZ3JhbSBhbmQgb3BlcmF0ZWQgYnkgQ0VSTi4gSXQgYWxsb3dzIHJlc2VhcmNoZXJzIHRvIGRlcG9zaXQgZGF0YSBzZXRzLCByZXNlYXJjaCBzb2Z0d2FyZSwgcmVwb3J0cywgYW5kIGFueSBvdGhlciByZXNlYXJjaCByZWxhdGVkIGRpZ2l0YWwgYXJ0aWZhY3RzLiBGb3IgZWFjaCBzdWJtaXNzaW9uLCBhIHBlcnNpc3RlbnQgZGlnaXRhbCBvYmplY3QgaWRlbnRpZmllciAoRE9JKSBpcyBtaW50ZWQsIHdoaWNoIG1ha2VzIHRoZSBzdG9yZWQgaXRlbXMgZWFzaWx5IGNpdGVhYmxlLiAKKFNvdXJjZTogW1dpa2lwZWRpYV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWmVub2RvKSkKCiAgLSBBIHNhbXBsZSBwcm9qZWN0IFtsaW5rXShodHRwczovL3plbm9kby5vcmcvcmVjb3JkLzM4MjE5OTAjLlhzSmcySk16WThZKQoKICAtIEhvdyB0byB1cGxvYWQgZmlsZXMgdG8gWmVub2RvIFtmaWxlXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUk0S2E5NTNKZVlFJnQ9MnMpCgo=